import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
import java.util.ResourceBundle;

/*
    获取class能干什么？
        * 通过Class的newInstance()方法来实例化对象（已过时）
            注意：newInstance()内部实际上调用了无参数构造方法，必须保证无参构造方法存在
            Class c = Class.forName("User");
            Object o = c.newInstance();   //已过时，创建一个User类对象，调用无参构造方法
                -反射机制灵活性，再不改变java源代码的前提下，可以做到不同对象的实例化，传进来的类不一样，创建的对象就可以不一样

    Class.forName()发生了什么？
        如果只希望一个类的静态代码块执行，其他代码不执行，可以使用
            Class.forName("完整类名")
        这个方法的执行会导致类加载，类加载时，静态代码块执行

    研究一下文件路径问题
 */
public class ReflectTest02 {
    public static void main(String[] args) throws IOException {
        //fis1 = new FileInputStream("chapter21//temp")
        //这种方式路径缺点是：可移植性差，离开了IDEA，这个路径无效

        //绝对通用路径
        //注意：使用这种方式前提是这个文件必须在类路径下
        //凡是在src下的都是类路径下
        //src是类的根路径
        /*String path = Thread.currentThread().getContextClassLoader().getResource("user.properties").getPath();
        System.out.println(path);*/
        /*
        解释：
            Thread.currentThread()当前线程对象
            getContextClassLoader()是线程对象的方法，可以获取到当前线程对象的类加载器对象
            getResource()获取资源，这是类加载器的方法，当前线程的类加载器默认从类的根路径下加载资源
         */

        //直接以流的形式返回，直接获取流
        InputStream in = Thread.currentThread().getContextClassLoader().getResourceAsStream("user.properties");
        Properties pro = new Properties();
        pro.load(in);
        in.close();

        String username = pro.getProperty("userName");
        System.out.println(username);


        /*
         java.util包下提供了一个资源绑定器，便于获取属性配置文件的内容，只能绑定.properties文件
         使用这种方式，属性配置文件必须放在类路径下
         */

        //资源绑定器，只能绑定.properties文件。并且这个文件必须在类路径下。文件扩展名也必须是properties
        //并且在写路径的时候，路径后面的扩展名不能写
        //ResourceBundle bundle = ResourceBundle.getBundle("user");
        /*String username = bundle.getString("userName");
        System.out.println(username);*/


    }
}
